﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/// <summary>
/// 函数
/// https://www.runoob.com/csharp/csharp-methods.html
/// </summary>
namespace _04_function
{
    class Program
    {
        static void Main(string[] args)
        {
            int x = 9, y = 10;

            Console.WriteLine("before : x={0}, y={1}", x, y);

            //SwapNormal(x, y);

            //SwapRef(ref x, ref y);

            int x2, y2;

            SwapOut(x, y, out x2, out y2);
            Console.WriteLine("after : x2={0}, y2={1}", x2, y2);

            Console.WriteLine("after : x={0}, y={1}", x, y);
           

            Console.ReadKey();
        }

        static void SwapOut(int x, int y, out int x2, out int y2)
        {
            x2 = y;
            y2 = x;
        }


        /// <summary>
        /// 引用参数
        /// 这种方式复制参数的内存位置的引用给形式参数。这意味着，当形参的值发生改变时，同时也改变实参的值。
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        static void SwapRef(ref int x, ref int y)
        {
            int t = x;
            x = y;
            y = t;
        }

        /// <summary>
        /// 值参数
        /// 这种方式复制参数的实际值给函数的形式参数，实参和形参使用的是两个不同内存中的值。
        /// 在这种情况下，当形参的值发生改变时，不会影响实参的值，从而保证了实参数据的安全。
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        static void SwapNormal(int x, int y)
        {
            int t = x;
            x = y;
            y = t;
        }

    }
}
